#include "privatechatwindow.h"
#include "ui_privatechatwindow.h"
#include <QJsonDocument>
#include <QJsonObject>
#include <QFileDialog>
#include <QMessageBox>
#include "mytcpsocket.h"

PrivateChatWindow::PrivateChatWindow(struct st_personData user,struct st_friendData _friend,QWidget *parent) :
    QWidget(parent),
    ui(new Ui::PrivateChatWindow)
{
    ui->setupUi(this);

    // 渲染窗口
    setQssStyle(QString("../style/PrivateChatWindowStyle.qss"),this);

    this->setWindowFlags(Qt::CustomizeWindowHint | Qt::WindowCloseButtonHint);
    this->setMinimumSize(665,520);

    m_user = user;
    m_friend = _friend;

    ui->btn_history->setToolTip("查看历史聊天记录");
    ui->btn_joy->setToolTip("发送表情");
    ui->btn_sendfile->setToolTip("发送文件");

    //隐藏滚动条
    ui->listWidget_O->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //垂直滚动条
    ui->listWidget_O->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); //水平滚动条
    //设置关闭释放内存
    //this->setAttribute(Qt::WA_DeleteOnClose);
    //设置标题
    this->setWindowTitle(m_friend.nick);
    // 设置图标
    QString fUrl = QString("%1/%2.png").arg(PATH_IMG).arg(m_friend.dd_num);
    QPixmap fhead = PixmapToRoundOpenCV(downLoadFromUrl(fUrl));
    this->setWindowIcon(QIcon(fhead));
    //表情窗口
    qqfaceWindow = new MyQQFaceWindow(m_user,m_friend);

    QString hname = QString("%1.png").arg(m_user.dd_num);
    QString fname = QString("%1.png").arg(m_friend.dd_num);
    QString uurl = QString("%1/%2").arg(PATH_IMG).arg(hname);
    QString furl = QString("%1/%2").arg(PATH_IMG).arg(fname);
    int borderWidth = 15; // 边框的宽度
    cv::Scalar borderColor(0, 0, 0, 255);
    user_head = RoundBorderPixmap(downLoadFromUrl(uurl),borderWidth,borderColor);
    friend_head = RoundBorderPixmap(downLoadFromUrl(furl),borderWidth,borderColor);

    // 绑定回车 发送按钮
    connect(ui->te_input,&CustomTextEdit::sendButtonPressed,ui->btn_send,&QPushButton::click);

}

PrivateChatWindow::~PrivateChatWindow()
{
    delete ui;
}

void PrivateChatWindow::addTextRecord(struct st_msg msg)
{
    QListWidgetItem* item = new QListWidgetItem(ui->listWidget_O);  //创建一个QListWidgetItem
    item->setSizeHint(QSize(ui->listWidget_O->width(),row_H));  //设置大小(主要是行高)
    ui->listWidget_O->addItem(item);    //加入ListWidget中
    MyListWidgetItem* myitem;
    if(msg.send == GlobalObject::getGlobalObject()->getUserInfo().sdata.dd_num){ //自己发的
        myitem = new MyListWidgetItem(msg.contect, R_USER,user_head,msg.type,ui->listWidget_O->parentWidget());
    }else{  //好友发的
        myitem = new MyListWidgetItem(msg.contect, R_FRIEND,friend_head,msg.type,ui->listWidget_O->parentWidget());
    }
    myitem->seq = autoSeq++;  //记录下位置
    ui->listWidget_O->setItemWidget(item,myitem);   //用自定义Widget填充刚才创建的ListWidgetItem
    // 文本宽度超出最大限制,更新QListWidgetItem的高度
    connect(myitem,SIGNAL(sig_rectChange(QSize,int)),this,SLOT(updateItemSize(QSize,int)));

    // 滚动到底部
    ui->listWidget_O->scrollToBottom();
}

void PrivateChatWindow::addFileRecord(st_msg msg)
{
    QListWidgetItem* item = new QListWidgetItem(ui->listWidget_O);  //创建一个QListWidgetItem
    item->setSizeHint(QSize(ui->listWidget_O->width(),row_H));  //设置大小(主要是行高)
    ui->listWidget_O->addItem(item);    //加入ListWidget中
    MyListWidgetItem* myitem;
    if(msg.send == GlobalObject::getGlobalObject()->getUserInfo().sdata.dd_num){ //自己发的
        myitem = new MyListWidgetItem(msg.contect, R_USER,user_head,msg.type,ui->listWidget_O->parentWidget());
    }else{  //好友发的
        myitem = new MyListWidgetItem(msg.contect, R_FRIEND,friend_head,msg.type,ui->listWidget_O->parentWidget());
    }
    myitem->seq = autoSeq++;  //记录下位置
    ui->listWidget_O->setItemWidget(item,myitem);   //用自定义Widget填充刚才创建的ListWidgetItem
    //文本宽度超出最大限制,更新QListWidgetItem的高度
    connect(myitem,SIGNAL(sig_rectChange(QSize,int)),this,SLOT(updateItemSize(QSize,int)));

    // 滚动到底部
    ui->listWidget_O->scrollToBottom();
}

void PrivateChatWindow::addJoyRecord(st_msg msg)
{
    QListWidgetItem* item = new QListWidgetItem(ui->listWidget_O);  //创建一个QListWidgetItem
    item->setSizeHint(QSize(ui->listWidget_O->width(),row_H));  //设置大小(主要是行高)
    ui->listWidget_O->addItem(item);    //加入ListWidget中
    MyListWidgetItem* myitem;
    if(msg.send == GlobalObject::getGlobalObject()->getUserInfo().sdata.dd_num){ //自己发的
        myitem = new MyListWidgetItem(msg.contect, R_USER,user_head,msg.type,ui->listWidget_O->parentWidget());
    }else{  //好友发的
        myitem = new MyListWidgetItem(msg.contect, R_FRIEND,friend_head,msg.type,ui->listWidget_O->parentWidget());
    }
    myitem->seq = autoSeq++;  //记录下位置
    ui->listWidget_O->setItemWidget(item,myitem);   //用自定义Widget填充刚才创建的ListWidgetItem
    //文本宽度超出最大限制,更新QListWidgetItem的高度
    connect(myitem,SIGNAL(sig_rectChange(QSize,int)),this,SLOT(updateItemSize(QSize,int)));

    // 滚动到底部
    ui->listWidget_O->scrollToBottom();
}

void PrivateChatWindow::closeEvent(QCloseEvent *event)
{
    // 因为表情窗口没有父对象,所以关闭私聊窗口时也关闭表情窗口
    qqfaceWindow->hide();
}

void PrivateChatWindow::updateItemSize(QSize size,int index)
{
    //更新对应Item的高
    ui->listWidget_O->item(index)->setSizeHint(size);
    update();
}

void PrivateChatWindow::on_btn_send_clicked()
{
    //获取用户输入的文本
    QString text = ui->te_input->toPlainText();
    ui->te_input->clear();
    //封装数据报文
    QVariantMap map;
    map["cmd"]="private_chat";
    map["send"] = m_user.dd_num;
    map["recv"] = m_friend.dd_num;
    map["type"] = 51;   //消息类型 文本消息
    map["content"] = text;

    //发送数据报文
    GlobalObject::getGlobalObject()->sendRequest(map);

}

/*
    该程序用于演示 Linux基于TCP的文件传输  的客户端
    客户端流程: (发送文件)
    1)把待传输的文件名和文件大小告诉服务端
    2)等待服务端的确认报文(文件名和文件大小的确认)
    3)发送文件内容
    4)等待服务端的确认报文(服务端已接收完文件)

    tcp是可靠的协议,所以收到内容后只需要向客户端回复:"ok,我收到了"
    但如果是不可靠的协议,还需要和客户端核对收到的内容

*/
void PrivateChatWindow::on_btn_sendfile_clicked()
{
    QString path = QFileDialog::getOpenFileName(this,tr("选择一个文件"),"../test/","*.txt");
    GlobalObject::getGlobalObject()->setSendfilePath(path);
    if(GlobalObject::getGlobalObject()->getSendfilePath().isNull())
        return;
    //获取文件信息
    QFileInfo fileinfo(GlobalObject::getGlobalObject()->getSendfilePath());
    //文件名(带有后缀)
    QString fname = fileinfo.fileName();
    //文件大小(KB)
    qint64 fsize = fileinfo.size();

    GlobalObject::getGlobalObject()->setCurrentSendFileUid(m_friend.dd_num);

    QVariantMap map;
    map["cmd"] = "file_head";
    map["filename"] = fname;
    map["filesize"] = fsize;

    //发送文件头
    GlobalObject::getGlobalObject()->sendRequest(map);
    // 上传私聊文件
    GlobalObject::getGlobalObject()->setUpload_file_flag(1);

}


void PrivateChatWindow::on_btn_joy_clicked()
{
    if(ui->btn_joy->isChecked() == true){
        //获取控件相对于全局的坐标
        int x = ui->btn_joy->mapToGlobal(QPoint(0,0)).x();
        int y = ui->btn_joy->mapToGlobal(QPoint(0,0)).y();
        int h = qqfaceWindow->height();
        qqfaceWindow->move(QPoint(x,y-h));
        qqfaceWindow->raise();
        qqfaceWindow->show();
    }else{
        qqfaceWindow->hide();
    }
}


void PrivateChatWindow::on_btn_history_clicked()
{
    if(historyMsgNum == 0){
        //封装报文
        QVariantMap map;
        map["cmd"]="get_history_msg";
        map["uid"] = m_user.dd_num;
        map["fid"] = m_friend.dd_num;

        //发送报文
        GlobalObject::getGlobalObject()->sendRequest(map);

        historyMsgNum++;
    }else {
        QMessageBox::information(this,"消息漫游","历史消息记录已经漫游");
    }

}

